%fa-icon {
  &::before {
    @include fa-icon;
    margin-right: $padding-small-vertical;
  }
}

%fa-icon-after {
  &::after {
    display: inline-block;
    margin-left: $padding-small-vertical;
    font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
    font-size: inherit; // can't have font-size inherit on line above, so need to override
    text-rendering: auto; // optimizelegibility throws things off #1094
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }
}

$icon-map: (
  icon-add:                     $fa-var-plus-square,
  icon-edit:                    $fa-var-pencil,
  icon-copy:                    $fa-var-copy,
  icon-duplicate:               $fa-var-clipboard,
  icon-del:                     $fa-var-trash,
  icon-move:                    $fa-var-arrows,
  icon-save:                    $fa-var-save,
  icon-download:                $fa-var-download,
  icon-cancel:                  $fa-var-ban,
  icon-multiple:                $fa-var-plus-circle,
  icon-folder:                  $fa-var-folder,
  icon-package:                 $fa-var-cube,
  icon-user:                    $fa-var-user,
  icon-project:                 $fa-var-cube,
  icon-projects:                $fa-var-cubes,
  icon-help:                    $fa-var-info-circle,
  icon-attachment:              $fa-var-paperclip,
  icon-history:                 $fa-var-history,
  icon-time-entry:              $fa-var-clock-o,
  icon-time:                    $fa-var-clock-o,
  icon-time-add:                $fa-var-clock-o,
  icon-stats:                   $fa-var-line-chart,
  icon-warning:                 $fa-var-warning,
  icon-error:                   $fa-var-exclamation,
  icon-fav:                     $fa-var-star,
  icon-fav-off:                 $fa-var-star-o,
  icon-heart:                   $fa-var-heart,
  icon-heart-off:               $fa-var-heart-o,
  icon-reload:                  $fa-var-refresh,
  icon-locked:                  $fa-var-lock,
  icon-lock:                    $fa-var-lock,
  icon-unlock:                  $fa-var-unlock,
  icon-checked:                 $fa-var-check,
  icon-details:                 $fa-var-search-plus,
  icon-report:                  $fa-var-pie-chart,
  icon-comments:                $fa-var-comment,
  icon-comment:                 $fa-var-comment,
  icon-summary:                 $fa-var-file-text,
  icon-server-authentication:   $fa-var-key,
  icon-issue:                   $fa-var-ticket,
  icon-zoom-in:                 $fa-var-search-plus,
  icon-zoom-out:                $fa-var-search-minus,
  icon-magnifier:               $fa-var-search,
  icon-passwd:                  $fa-var-key,
  icon-arrow-right:             $fa-var-arrow-right,
  icon-test:                    $fa-var-arrow-circle-right,
  icon-sticky:                  $fa-var-thumb-tack,
  icon-email:                   $fa-var-envelope,
  icon-email-disabled:          $fa-var-envelope-o,
  icon-email-add:               $fa-var-envelope,
  icon-ok:                      $fa-var-check,
  icon-not-ok:                  $fa-var-times,
  icon-link-break:              $fa-var-chain-broken,
  icon-list:                    $fa-var-list-ul,
  icon-close:                   $fa-var-times-circle,
  icon-settings:                $fa-var-cog,
  icon-group:                   $fa-var-users,
  icon-groupnonmember:          $fa-var-users,
  icon-groupanonymous:          $fa-var-users,
  icon-roles:                   $fa-var-eye,
  icon-issue-edit:              $fa-var-edit,
  icon-workflows:               $fa-var-sitemap,
  icon-custom-fields:           $fa-var-edit,
  icon-plugins:                 $fa-var-puzzle-piece,
  icon-news:                    $fa-var-newspaper-o,
  icon-issue-closed:            $fa-var-ticket,
  icon-issue-note:              $fa-var-comment,
  icon-changeset:               $fa-var-upload,
  icon-message:                 $fa-var-comment,
  icon-reply:                   $fa-var-comment-o,
  icon-wiki-page:               $fa-var-file-text-o,
  icon-document:                $fa-var-file-text,
  icon-add-bullet:              $fa-var-plus-circle,
  icon-shared:                  $fa-var-link,
  icon-actions:                 $fa-var-ellipsis-h,
  icon-sort-handle:             $fa-var-arrows-v,
  /* typo "expended" has to be kept for backwards compatibility */
  icon-expended:                $fa-var-chevron-down,
  icon-expanded:                $fa-var-chevron-down,
  icon-collapsed:               $fa-var-chevron-right,
  icon-bookmark:                $fa-var-bookmark,
  icon-bookmark-off:            $fa-var-bookmark-o,
  icon-sorted-asc:              $fa-var-sort-amount-asc,
  icon-sorted-desc:             $fa-var-sort-amount-desc,
  icon-toggle-plus:             $fa-var-plus-square,
  icon-toggle-minus:            $fa-var-minus-square,
  icon-clear-query:             $fa-var-times,
  icon-import:                  $fa-var-cloud-upload,
  icon-bookmarked-project:      $fa-var-tag,
  icon-copy-link:               $fa-var-clipboard,

  // Plugin icons
  icon-call:                    $fa-var-phone,
  icon-contact:                 $fa-var-vcard,
  icon-erase:                   $fa-var-eraser,
  icon-facebook:                $fa-var-facebook-square,
  icon-fullscreen:              $fa-var-arrows-alt,
  icon-linkedin:                $fa-var-linkedin-square,
  icon-meeting:                 $fa-var-calendar-check-o,
  icon-merge:                   $fa-var-code-fork,
  icon-money-dollar:            $fa-var-usd,
  icon-money-euro:              $fa-var-eur,
  icon-money-pound:             $fa-var-gbp,
  icon-money-yen:               $fa-var-jpy,
  icon-move-bottom:             $fa-var-angle-double-down,
  icon-move-down:               $fa-var-angle-down,
  icon-move-top:                $fa-var-angle-double-up,
  icon-move-up:                 $fa-var-angle-up,
  icon-phone:                   $fa-var-phone,
  icon-skype:                   $fa-var-skype,
  icon-tags:                    $fa-var-tags,
  icon-twitter:                 $fa-var-twitter-square,
  icon-vcard:                   $fa-var-vcard,
  banner-icon-edit:             $fa-var-edit,
  banner-icon-off:              $fa-var-times,
);

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(359deg);
  }
}

table.list .buttons > a::before {
  font-size: $fa-font-size-base;
}


//== Buttons icons
//

.icon,
.icon-only:not(.toggle-multiselect) {
  @extend %fa-icon;
  padding-left: $icon-width;
  background-repeat: no-repeat;
  background-position: 0% 50%;

  &::before {
    margin-left: -$icon-width;
  }
}

.icon-only {
  display: inline-block;
  width: 0;
  overflow: hidden;
  vertical-align: top;
  white-space: nowrap;

  &::before {
    width: $icon-width;
    text-align: center;
  }
}

// A empty icon should behave more like icon-only
a.icon:empty {
  display: inline-block;
}

span.icon + span.icon {
  margin-left: $padding-small-vertical;
}

$icons-selector: ();
@each $class, $icon in $icon-map {
  $icons-selector: append($icons-selector, unquote(".#{$class}"), "comma");

  .#{$class} {
    &::before {
      content: $icon;

      @if $class == "icon-fav" {
        color: $orange;
      } @else if $class == "icon-heart" {
        color: $pink;
      } @else if $class == "icon-bookmarked-project" {
        color: $blue;
      }
    }

    @if $class == "icon-close" {
      &:hover::before {
        content: $fa-var-times-circle-o;
      }
    } @else if $class == "icon-folder" {
      .open &::before {
        content: $fa-var-folder-open;
      }
    }
  }
}

#{$icons-selector} {
  &.icon {
    background-image: none;
  }
}

//== Checkbox toggler
//

a.toggle-checkboxes {
  @extend %fa-icon;

  &::before {
    content: $fa-var-check-square-o;
  }
}


//== Colorize some actions
//

a.icon,
a.icon-only {
  @include link-variant(default);
}

.icon-checked {
  @include link-variant(success, false);
}

a.icon-add,
a.icon-save,
a.icon-checked {
  @include link-variant(success);
}

a.icon-del {
  @include link-variant(danger);
}


//== File types
//

.icon-folder,
.icon-file {
  &::before {
    width: $icon-width;
    text-align: center;
  }
}

.icon-file {
  &::before {
    content: $fa-var-file-o;
    color: $gray-700;
  }

  &.text-plain::before         { content: $fa-var-file-text-o; }
  &.text-x-c::before           { content: $fa-var-file-code-o; }
  &.text-x-csharp::before      { content: $fa-var-file-code-o; }
  &.text-x-java::before        { content: $fa-var-file-code-o; }
  &.text-x-php::before         { content: $fa-var-file-code-o; }
  &.text-x-ruby::before        { content: $fa-var-file-code-o; }
  &.text-xml::before           { content: $fa-var-file-code-o; }
  &.text-css::before           { content: $fa-var-file-code-o; }
  &.text-html::before          { content: $fa-var-file-code-o; }
  &.text-x-sh::before          { content: $fa-var-file-text-o; }

  &.application-javascript::before,
  &.text-x-javascript::before { content: $fa-var-file-code-o; }

  &.application-pdf::before    { content: $fa-var-file-pdf-o; }
  &.application-msword::before { content: $fa-var-file-word-o; }

  &.application-vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet::before,
  &.application-vnd\.ms-excel::before { content: $fa-var-file-excel-o; }

  &.image-vnd\.microsoft\.icon::before,
  &.image-gif::before,
  &.image-jpeg::before,
  &.image-png::before,
  &.image-tiff::before {
    content: $fa-var-file-image-o;
  }

  &.application-zip::before,
  &.application-x-gzip::before {
    content: $fa-var-file-zip-o;
  }
}

.icon-expended,
.icon-collapsed {
  &::before {
    text-align: center;
  }

  &.icon {
    padding-left: $icon-width;
  }

  &.expander {
    background-image: none;
  }
}

.icon-zoom-in + .icon-zoom-out {
  margin-left: $padding-small-vertical;
}


//== Administration menu sections
//

%admin-icon {
  @extend %fa-icon;

  &:hover::before {
    color: $gray-900;
  }

  &.selected::before {
    color: $gray-950;
  }
}

#admin-menu {
  #admin-index > & {
    a {
      padding-left: 5px + $icon-width;
    }
  }

  li {
    > a {
      padding-left: $sidebar-padding-horizontal + 5px + $icon-width;

      &::before {
        display: inline-block;
        width: $icon-width;
        margin: 0;
        margin-left: -(5px + $icon-width);
        padding: 0;
        color: $gray-700;
        text-align: center;
      }
    }
  }

  .projects {
    @extend %admin-icon;

    &::before { content: $fa-var-cubes; }
  }

  .users {
    @extend %admin-icon;

    &::before { content: $fa-var-user; }
  }

  .groups {
    @extend %admin-icon;

    &::before { content: $fa-var-group; }
  }

  .roles {
    @extend %admin-icon;

    &::before { content: $fa-var-eye; }
  }

  .trackers {
    @extend %admin-icon;

    &::before { content: $fa-var-ticket; }
  }

  .issue-statuses,
  .issue_statuses {
    @extend %admin-icon;

    &::before { content: $fa-var-pencil-square; }
  }

  .workflows {
    @extend %admin-icon;

    &::before { content: $fa-var-sitemap; }
  }

  .custom-fields,
  .custom_fields {
    @extend %admin-icon;

    &::before { content: $fa-var-edit; }
  }

  .enumerations {
    @extend %admin-icon;

    &::before { content: $fa-var-list; }
  }

  .settings {
    @extend %admin-icon;

    &::before { content: $fa-var-gear; }
  }

  .plugins {
    @extend %admin-icon;

    &::before { content: $fa-var-puzzle-piece; }
  }

  .info {
    @extend %admin-icon;

    &::before { content: $fa-var-info-circle; }
  }

  .ldap-authentication,
  .server_authentication {
    @extend %admin-icon;

    &::before { content: $fa-var-key; }
  }
}


//== Drag-and-drop sorting
//

.sort-handle {
  @extend %fa-icon;
  text-align: center;
  cursor: move;

  &::before {
    content: $fa-var-arrows-v;
  }

  &.ajax-loading {
    &::before {
      content: $fa-var-refresh;
      animation: spin 1s linear infinite;
      color: $gray-700;
    }
  }
}


//== Headers with icons
//

h3.icon,
h3.version,
h3.comments,
div.issues h3,
div.members h3,
div.news h3,
div.projects h3 {
  @extend %fa-icon;
  color: $gray-900;

  &::before {
    width: $icon-width;
    margin-right: $padding-small-vertical;
    transform: translateY(-.1em);
    color: $gray-700;
    text-align: center;
  }
}

h3.version::before      { content: $fa-var-cube; }
h3.comments::before     { content: $fa-var-comments; }
div.issues h3::before   { content: $fa-var-ticket; }
div.members h3::before  { content: $fa-var-users; }
div.news h3::before     { content: $fa-var-newspaper-o; }
div.projects h3::before { content: $fa-var-cubes; }


//== Activity types icons
//

dt {
  &.issue,
  &.issue-edit,
  &.issue.closed,
  &.issue-closed,
  &.issue-note,
  &.changeset,
  &.news,
  &.message,
  &.reply,
  &.wiki-page,
  &.attachment,
  &.document,
  &.project,
  &.time-entry {
    @extend %fa-icon;

    &::before {
      margin-left: -$padding-side;
      float: left;
      line-height: $line-height-computed;
    }
  }

  &.issue::before        { content: $fa-var-ticket; }
  &.issue-edit::before   { content: $fa-var-edit; }
  &.issue.closed::before { content: $fa-var-ticket; }
  &.issue-closed::before { content: $fa-var-ticket; }
  &.issue-note::before   { content: $fa-var-comment; }
  &.changeset::before    { content: $fa-var-upload; }
  &.news::before         { content: $fa-var-newspaper-o; }
  &.message::before      { content: $fa-var-comment; }
  &.reply::before        { content: $fa-var-comment-o; }
  &.wiki-page::before    { content: $fa-var-file-text-o; }
  &.attachment::before   { content: $fa-var-paperclip; }
  &.document::before     { content: $fa-var-file-text; }
  &.project::before      { content: $fa-var-cube; }
  &.time-entry::before   { content: $fa-var-clock-o; }
}


//== Alternative icons
//

.search_for_watchers > a {
  @extend %fa-icon;
  @include icon-variant(success);

  &::before {
    content: $fa-var-plus;
  }

  img {
    display: none;
  }
}

.atom {
  @extend %fa-icon;

  &::before {
    content: $fa-var-rss-square;
  }
}

.issues .buttons a,
#related-issues li > a {
  &[data-method="delete"] {
    @extend %fa-icon;

    &::before {
      content: $fa-var-chain-broken;
    }

    img {
      display: none;
    }
  }
}

#main a.close-icon {
  @extend %fa-icon;
  @include link-variant(danger);
  width: auto;
  height: auto;
  background: transparent;

  &::before {
    content: $fa-var-remove;
  }
}

a.project {
  $svg-star: inline-svg("icon-star.svg", (path: (fill: $orange)));
  $svg-tag: inline-svg("icon-tag.svg", (path: (fill: $blue)));

  &.icon {
    padding-left: 0;

    &::before {
      content: "";
      display: none;
      margin: 0;
    }
  }

  &.my-project,
  &.icon-user,
  &.icon-bookmarked-project {
    padding-right: $icon-width;
    background-image: $svg-star;
    background-repeat: no-repeat;
    background-position: bottom .2em right 0, bottom .2em right $icon-width;
  }

  &.icon-bookmarked-project {
    background-image: $svg-tag;
  }

  &.icon-user.icon-bookmarked-project {
    padding-right: $icon-width * 2;
    background-image: $svg-tag, $svg-star;
  }
}

span.my-project {
  @extend %fa-icon;

  &::before {
    content: $fa-var-star;
    width: $icon-width;
    margin-right: 0;
    color: $orange;
    text-align: center;
  }
}

.sort {
  @extend %fa-icon-after;
  padding-left: 0;

  &::before {
    content: none;
  }

  &::after {
    margin-left: .2em;
  }

  &.asc,
  &.desc {
    background-image: none;
  }

  &.asc::after {
    content: $fa-var-sort-amount-asc;
  }

  &.desc::after {
    content: $fa-var-sort-amount-desc;
  }

  .sort-by-id &,
  .sort-by-done-ratio &,
  .sort-by-estimated-hours &,
  .sort-by-spent-hours & {
    &.asc::after  { content: $fa-var-sort-numeric-asc; }
    &.desc::after { content: $fa-var-sort-numeric-desc; }
  }

  .sort-by-assigned-to &,
  .sort-by-subject & {
    &.asc::after  { content: $fa-var-sort-alpha-asc; }
    &.desc::after { content: $fa-var-sort-alpha-desc; }
  }
}

a.remove-upload {
  @extend %fa-icon;
  @include link-variant(danger);
  opacity: $icon-opacity;
  text-align: center;

  &:hover,
  &:focus {
    opacity: $icon-hover-opacity;
    text-decoration: none;
  }

  &::before {
    content: $fa-var-trash;
  }
}

em.info.error {
  @extend %fa-icon;

  &::before {
    content: $fa-var-exclamation-circle;
  }
}

.message {
  .contextual {
    a {
      @extend %fa-icon;
      opacity: .7;

      &:hover,
      &:focus {
        opacity: 1;
      }

      img {
        display: none;
      }
    }
  }

  > .contextual {
    a {
      &:nth-child(1) {
        &::before {
          content: $fa-var-comment;
        }
      }

      &:nth-child(2) {
        &::before {
          content: $fa-var-pencil;
        }
      }

      &:nth-child(3) {
        &::before {
          content: $fa-var-trash;
        }
      }
    }
  }
}

tr.message {
  &.locked td.subject,
  &.sticky td.subject {
    @extend %fa-icon;
  }

  &.locked {
    color: $gray-700;

    td.subject {
      &::before {
        content: $fa-var-lock;
      }
    }
  }

  &.sticky td.subject {
    font-weight: $font-weight-bold;

    &::before {
      content: $fa-var-bookmark;
    }
  }
}

tr.version.shared td.name {
  @extend %fa-icon;

  &::before {
    content: $fa-var-link;
  }
}

table.boards {
  a.board {
    @extend %fa-icon;

    &::before {
      content: $fa-var-comments;
    }
  }
}

table.members {
  td.group,
  td.groupnonmember,
  td.groupanonymous {
    @extend %fa-icon;

    &::before {
      content: $fa-var-group;
    }
  }
}

div.wiki {
  .external {
    @extend %fa-icon;

    &::before {
      content: $fa-var-external-link;
      display: inline;
      margin-right: 3px;
      font-size: 10px;
    }
  }
}

.contextual [href*="edit"] {
  @extend %fa-icon;

  &::before {
    content: $fa-var-pencil;
  }

  img {
    display: none;
  }
}

#attach_files_link {
  @extend %fa-icon;

  &::before {
    content: $fa-var-plus;
    margin-right: .3em;
  }
}

.other-formats {
  %other-format {
    @extend %fa-icon;
    background-image: none;

    &::before {
      margin-right: .3em;
    }
  }

  .pdf {
    @extend %other-format;

    &::before {
      content: $fa-var-file-pdf-o;
    }
  }

  .html {
    @extend %other-format;

    &::before {
      content: $fa-var-file-code-o;
    }
  }

  .txt {
    @extend %other-format;

    &::before {
      content: $fa-var-file-text-o;
    }
  }

  .csv {
    @extend %other-format;

    &::before {
      content: $fa-var-file-excel-o;
    }
  }

  .png {
    @extend %other-format;

    &::before {
      content: $fa-var-file-image-o;
    }
  }
}


//== Hacks and overrides for Font Awesome
//

// Attachments and watchers delete icon

.attachments,
.watchers {
  a.delete {
    @extend %fa-icon;
    @include icon-variant(danger);

    &::before {
      content: $fa-var-trash;
    }

    img {
      display: none;
    }
  }
}


// Issue edit form icon

#all_attributes label[for="issue_description"] + a {
  @extend %fa-icon;

  &::before {
    content: $fa-var-pencil;
  }

  .icon {
    padding-left: 0;

    &::before {
      content: "";
      margin: 0;
    }
  }

  img {
    display: none;
  }
}


// Issue journal contextual icons

.journal .wiki .contextual {
  > a {
    @extend %fa-icon;

    &::before {
      width: $icon-width;
      margin-right: 0;
      text-align: center;
    }

    &:not([class*="icon"]) {
      &::before {
        content: $fa-var-comment;
      }

      &:nth-child(2) {
        &::before {
          content: $fa-var-pencil;
        }
      }

      &:nth-child(3) {
        &::before {
          content: $fa-var-trash;
        }
      }
    }

    img {
      display: none;
    }
  }
}


// Category and target vesion add icon

#issue_category_id + a,
#issue_fixed_version_id + a {
  @extend %fa-icon;
  @include icon-variant(success);

  &::before {
    content: $fa-var-plus-square;
  }

  img {
    display: none;
  }
}


// jQuery UI datepicker trigger button

img.ui-datepicker-trigger {
  position: relative;
  top: -1px;
  box-sizing: border-box;
  width: 14px;
  height: 14px;
  padding-left: 14px;
  background-image: inline-svg("calendar.svg", (path: (fill: $btn-default-icon-color)));
  background-repeat: no-repeat;
  background-position: center center;
}


// Lists toggle checkbox icon

table.list th.checkbox > a {
  @extend %fa-icon;
  @include icon-variant(success);

  &::before {
    content: $fa-var-check;
    margin-right: 0;
  }

  img {
    display: none;
  }
}


// Time entries list icons

.time-entry .buttons > a {
  @extend %fa-icon;

  &[href*="edit"]::before {
    content: $fa-var-pencil;
  }

  &[data-method="delete"]::before {
    content: $fa-var-trash;
  }

  img {
    display: none;
  }
}


// Files list

.file .buttons > a {
  @extend %fa-icon;

  &[data-method="delete"] {
    @include icon-variant(danger);

    &::before {
      content: $fa-var-trash;
    }
  }

  img {
    display: none;
  }
}


// Commit keywords

.delete-commit-keywords {
  @extend %fa-icon;
  @include icon-variant(danger);
  font-size: $font-size-base;

  &::before {
    content: $fa-var-trash;
  }

  img {
    display: none;
  }
}

.add-commit-keywords {
  @extend %fa-icon;
  @include icon-variant(success);
  font-size: $font-size-base;

  &::before {
    content: $fa-var-plus-square;
  }

  img {
    display: none;
  }
}
